home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
3D GFX
/
3D GFX.iso
/
amiutils
/
i_l
/
irit5
/
triv_lib
/
triv_aux.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-12-30
|
11KB
|
255 lines
/******************************************************************************
* Triv_aux.c - auxiliary routine to interface to tri-variate rep. *
*******************************************************************************
* Written by Gershon Elber, Sep. 94. *
******************************************************************************/
#include "triv_loc.h"
/*****************************************************************************
* DESCRIPTION: M
* Given a tri-variate, returns its parametric domain. M
* *
* PARAMETERS: M
* TV: Trivariate function to consider. M
* UMin, UMax: U Domain of TV will be placed herein. M
* VMin, VMax: V Domain of TV will be placed herein. M
* WMin, WMax: W Domain of TV will be placed herein. M
* *
* RETURN VALUE: M
* void M
* *
* KEYWORDS: M
* TrivTVDomain, trivariates M
*****************************************************************************/
void TrivTVDomain(TrivTVStruct *TV,
CagdRType *UMin,
CagdRType *UMax,
CagdRType *VMin,
CagdRType *VMax,
CagdRType *WMin,
CagdRType *WMax)
{
int UOrder, VOrder, WOrder, ULen, VLen, WLen;
switch (TV -> GType) {
case TRIV_TVBEZIER_TYPE:
*UMin = 0.0;
*UMax = 1.0;
*VMin = 0.0;
*VMax = 1.0;
*WMin = 0.0;
*WMax = 1.0;
break;
case TRIV_TVBSPLINE_TYPE:
UOrder = TV -> UOrder;
VOrder = TV -> VOrder;
WOrder = TV -> WOrder;
ULen = TV -> ULength;
VLen = TV -> VLength;
WLen = TV -> WLength;
*UMin = TV -> UKnotVector[UOrder - 1];
*UMax = TV -> UKnotVector[ULen];
*VMin = TV -> VKnotVector[VOrder - 1];
*VMax = TV -> VKnotVector[VLen];
*WMin = TV -> WKnotVector[WOrder - 1];
*WMax = TV -> WKnotVector[WLen];
break;
default:
TRIV_FATAL_ERROR(TRIV_ERR_UNDEF_GEOM);
break;
}
}
/*****************************************************************************
* DESCRIPTION: M
* Given a tri-variate and a domain - validate it. M
* *
* PARAMETERS: M
* TV: To make sure t is in its Dir domain. M
* t: Parameter value to verify. M
* Dir: Direction. Either U or V or W. M
* *
* RETURN VALUE: M
* CagdBType: TRUE if in domain, FALSE otherwise. M
* *
* KEYWORDS: M
* TrivParamInDomain, trivariates M
*****************************************************************************/
CagdBType TrivParamInDomain(TrivTVStruct *TV, CagdRType t, TrivTVDirType Dir)
{
CagdRType UMin, UMax, VMin, VMax, WMin, WMax;
TrivTVDomain(TV, &UMin, &UMax, &VMin, &VMax, &WMin, &WMax);
switch (Dir) {
case TRIV_CONST_U_DIR:
return t >= UMin && t <= UMax;
case TRIV_CONST_V_DIR:
return t >= VMin && t <= VMax;
case TRIV_CONST_W_DIR:
return t >= WMin && t <= WMax;
default:
TRIV_FATAL_ERROR(TRIV_ERR_WRONG_DOMAIN);
return FALSE;
}
}
/*****************************************************************************
* DESCRIPTION: M
* Given a tri-variate and a domain - validate it. M
* *
* PARAMETERS: M
* TV: To make sure (u, v, w) is in its domain. M
* u, v, w: To verify if it is in TV's parametric domain. M
* *
* RETURN VALUE: M
* CagdBType: TRUE if in domain, FALSE otherwise. M
* *
* KEYWORDS: M
* TrivParamsInDomain, trivariates M
*****************************************************************************/
CagdBType TrivParamsInDomain(TrivTVStruct *TV,
CagdRType u,
CagdRType v,
CagdRType w)
{
CagdRType UMin, UMax, VMin, VMax, WMin, WMax;
TrivTVDomain(TV, &UMin, &UMax, &VMin, &VMax, &WMin, &WMax);
return u >= UMin && u <= UMax &&
v >= VMin && v <= VMax &&
w >= WMin && w <= WMax;
}
/*****************************************************************************
* DESCRIPTION: M
* Given a tri-variate, returns a sub-region of it. M
* *
* PARAMETERS: M
* TV: To extract asub-region from. M
* t1, t1: Domain to extract from TV, in parametric direction Dir. M
* Dir: Direction to extract the sub-region. Either U or V or W. M
* *
* RETURN VALUE: M
* TrivTVStruct *: A sub-region of TV from t1 to t2 in direction Dir. M
* *
* KEYWORDS: M
* TrivTVRegionFromTV, trivariates M
*****************************************************************************/
TrivTVStruct *TrivTVRegionFromTV(TrivTVStruct *TV,
CagdRType t1,
CagdRType t2,
TrivTVDirType Dir)
{
CagdRType RMin, RMax, SMin, SMax, TMin, TMax, R1, R2;
TrivTVStruct *TVs;
CagdBType
NewTV = FALSE;
switch (TV -> GType) {
case TRIV_TVBEZIER_TYPE:
TMin = 0.0;
TMax = 1.0;
break;
case TRIV_TVBSPLINE_TYPE:
switch (Dir) {
case TRIV_CONST_U_DIR:
TrivTVDomain(TV, &R1, &R2, &SMin, &SMax, &TMin, &TMax);
break;
case TRIV_CONST_V_DIR:
TrivTVDomain(TV, &RMin, &RMax, &R1, &R2, &TMin, &TMax);
break;
case TRIV_CONST_W_DIR:
TrivTVDomain(TV, &RMin, &RMax, &SMin, &SMax, &R1, &R2);
break;
default:
TRIV_FATAL_ERROR(TRIV_ERR_DIR_NOT_VALID);
break;
}
break;
default:
TRIV_FATAL_ERROR(TRIV_ERR_UNDEF_GEOM);
return NULL;
}
if (t1 > t2)
SWAP(CagdRType, t1, t2);
if (!APX_EQ(t1, TMin)) {
TVs = TrivTVSubdivAtParam(TV, t1, Dir);
TV = TVs -> Pnext;
TVs -> Pnext = NULL;
TrivTVFree(TVs); /* Free the first region. */
NewTV = TRUE;
}
if (APX_EQ(t2, TMax))
return NewTV ? TV : TrivTVCopy(TV);
else {
TVs = TrivTVSubdivAtParam(TV, t2, Dir);
if (NewTV)
TrivTVFree(TV);
TrivTVFree(TVs -> Pnext); /* Free the second region. */
TVs -> Pnext = NULL;
return TVs; /* Returns the first region. */
}
}
/*****************************************************************************
* DESCRIPTION: M
* Computes a bounding box for a trivariate freeform function. M
* *
* PARAMETERS: M
* Trivar: To compute a bounding box for. M
* BBox: Where bounding information is to be saved. M
* *
* RETURN VALUE: M
* void M
* *
* KEYWORDS: M
* TrivTVBBox, bbox, bounding box M
*****************************************************************************/
void TrivTVBBox(TrivTVStruct *Trivar, CagdBBoxStruct *BBox)
{
TrivTVStruct
*E3TV = TrivCoerceTVTo(Trivar, CAGD_PT_E3_TYPE);
int Length = E3TV -> ULength * E3TV -> VLength * E3TV -> WLength;
CagdRType
**Points = E3TV -> Points;
CagdPointsBBox(Points, Length, BBox);
TrivTVFree(E3TV);
}
/*****************************************************************************
* DESCRIPTION: M
* Computes a bounding box for a list of trivariate freeform function. M
* *
* PARAMETERS: M
* Trivars: To compute a bounding box for. M
* BBox: Where bounding information is to be saved. M
* *
* RETURN VALUE: M
* void M
* *
* KEYWORDS: M
* TrivTVListBBox, bbox, bounding box M
*****************************************************************************/
void TrivTVListBBox(TrivTVStruct *TVs, CagdBBoxStruct *BBox)
{
CAGD_RESET_BBOX(BBox);
for ( ; TVs != NULL; TVs = TVs -> Pnext) {
CagdBBoxStruct TmpBBox;
TrivTVBBox(TVs, &TmpBBox);
CagdMergeBBox(BBox, &TmpBBox);
}
}